共计 1150 个字符,预计需要花费 3 分钟才能阅读完成。
依赖注入几种方式。
封装为库
以pulsar的使用为例。特点:需要注入配置,创建client单例。
实现方式:在module中定义static register方法,返回DynamicModule。
static register(options: any): DynamicModule { | |
return { | |
// 封装的模块的名字,即当前模块的名字 | |
module: PulsarModule, | |
imports: options.imports || [], | |
providers: [ | |
{ | |
// 可以在其它模块使用此字符串注入 | |
provide: 'PULSAR_CLIENT_URL', | |
useFactory: options.useFactory, | |
inject: options.inject, | |
}, | |
], | |
}; | |
} |
然后在对应service中提供client的方法:
import { Injectable, Inject } from '@nestjs/common'; | |
import { | |
Client, | |
Consumer, | |
Producer, | |
ProducerOpts, | |
SubscribeOpts, | |
} from 'pulsar-client'; | |
() | |
export class PulsarService { | |
pulsar: Client; | |
constructor('PULSAR_CLIENT_URL') private url) { ( | |
this.pulsar = new Client({ serviceUrl: url }); | |
} | |
async buildConsumer(options: SubscribeOpts): Promise<Consumer> { | |
return this.pulsar.subscribe(options); | |
} | |
async buildProducer(options: ProducerOpts): Promise<Producer> { | |
return this.pulsar.createProducer(options); | |
} | |
async closeArr(arr: Consumer[] | Producer[]) { | |
if (!arr || !arr.length) return; | |
for (const ele of arr) ele.close(); | |
} | |
async close(consumers?: Consumer[], producers?: Producer[]) { | |
this.closeArr(consumers); | |
this.closeArr(producers); | |
if (this.pulsar) { | |
this.pulsar.close(); | |
} | |
} | |
} |
关于pulsar,一个消息中间件,已经封装为一个npm库,欢迎使用,star。https://www.npmjs.com/package/nestjs-pulsar
正文完
Just adding my two cents, have you considered making this adjustment